package com.blue.base.common.jwt;

import cn.hutool.core.codec.Base64;
import com.blue.base.common.exception.BaseException;
import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtil {

    /**
     * 生成token
     */
    public static String generateToken(String account, String userId, String privateKey) throws Exception {
        // 1.header部分，用的不多
        Map<String, Object> claims = new HashMap(10);
        // 2.playLoad部分【自带的字段】
        claims.put("aud", account);
        claims.put("iat", new Date());
        // playLoad部分【自定义的字段】
        claims.put("userId", userId);
        // 3.拿到rsa的私钥(base64解密一下)
        PrivateKey rsaPrivateKey = RSAUtil.getPrivateKey(Base64.decode(privateKey));
        return Jwts.builder()
                // 数字加密主体
                .setClaims(claims)
                // 过期时间
                .setExpiration(new Date(System.currentTimeMillis() + 84000L * 1000))// 1天
                // 数字签名算法：rs256，使用私钥加密
                .signWith(SignatureAlgorithm.RS256, rsaPrivateKey)
                // 根据规则进行加密
                .compact();
    }

    /**
     * 获取jwt的claims部分(公钥解密token)
     */
    static Claims getPlayLoad(String token, String publicKey) throws Exception {
        if (StringUtils.isEmpty(token)) {
            throw new IllegalArgumentException("token参数为空！");
        }
        PublicKey rsaPublicKey = RSAUtil.getPublicKey(Base64.decode(publicKey));
        try {
            return Jwts.parser()
                    .setSigningKey(rsaPublicKey)
                    .parseClaimsJws(token)
                    .getBody();
        } catch (Exception e) {
            throw new BaseException(800, "Token解析异常");
        }
    }

}
